home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xsw / proc.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  10KB  |  360 lines

  1. /*
  2.  *    @(#) proc.c 12.1 95/05/09 SCOINC
  3.  */
  4. /***************************************************************************
  5.  *
  6.  *    Copyright (c) 1990-1993        The Santa Cruz Operation, Inc.
  7.  *
  8.  *    All rights reserved.  No part of this program or publication may be
  9.  *    reproduced, transmitted, transcribed, stored in a retrieval system,
  10.  *    or translated into any language or computer language, in any form or
  11.  *    by any means, electronic, mechanical, magnetic, optical, chemical,
  12.  *    biological, or otherwise, without the prior written permission of:
  13.  *
  14.  *        The Santa Cruz Operation , Inc.        (408) 425-7222
  15.  *        400 Encinal St., Santa Cruz, California 95060 USA
  16.  *
  17.  **************************************************************************/
  18. /*
  19.  * Modification History
  20.  *
  21.  * S002, 27-May-93, rickra
  22.  *     Added "get ticks since boot"...
  23.  *
  24.  * S001, 01-Jan-93, rickra
  25.  *     Added abs to user I/O times to ensure postive number....
  26.  *    Added support for seperate windows.
  27.  *
  28.  * S000, 30-Sep-92, rickra
  29.  *     Added copyright and modification history
  30.  *
  31.  */
  32. /*+-------------------------------------------------------------------------
  33.     proc.c - XSW proc table handler
  34.     wht@n4hgf.Mt-Park.GA.US
  35.  
  36.   Defined functions:
  37.     draw_update_Proc(x,y)
  38.     initialize_Proc()
  39.     grok_proc()
  40.     pstat_text(pstat)
  41.  
  42. --------------------------------------------------------------------------*/
  43. /*+:EDITS:*/
  44. /*:09-25-1990-05:11-wht@n4hgf-release heh-heh x0.22 preliminary */
  45. /*:09-20-1990-03:10-wht@n4hgf-adapt u386mon code */
  46.  
  47. #include <malloc.h>
  48. #include <X11/Xlib.h>
  49. #include <X11/Xutil.h>
  50. #include <X11/Intrinsic.h>
  51. #include <X11/Shell.h>
  52. #include <X11/StringDefs.h>
  53. #include <Xm/Xm.h>
  54. #include <Xm/MainW.h>
  55. #include <Xm/DrawingA.h>
  56.  
  57. #include "include/unixincs.h"
  58. #include "include/resources.h"
  59. #include "include/xswboth.h"
  60. #include "include/buttons.h"
  61. #include "include/libkmem.h"
  62. #include "include/xsw.h"
  63.  
  64. extern MyResources res;
  65.  
  66. extern struct nlist x[];
  67.  
  68. #define BX_PROCS        5
  69.  
  70. int             procs_per_pstat[SXBRK + 1];
  71. int             procs_in_core;
  72.  
  73. static int      line_style = LineSolid;
  74. static int      cap_style = CapButt;
  75. static int      join_style = JoinMiter;
  76.  
  77. #ifdef draw_update_Proc
  78. /*+-------------------------------------------------------------------------
  79.     pstat_text(pstat)
  80. --------------------------------------------------------------------------*/
  81. char           *
  82. pstat_text (pstat)
  83.      char            pstat;
  84. {
  85.   static char     errant[10];
  86.  
  87.   switch (pstat)
  88.     {
  89.     case SSLEEP:
  90.       return ("sleep ");
  91.     case SRUN:
  92.       return ("run   ");
  93.     case SZOMB:
  94.       return ("zombie");
  95.     case SSTOP:
  96.       return ("stop  ");
  97.     case SIDL:
  98.       return ("idle  ");
  99.     case SONPROC:
  100.       return ("onproc");
  101.     case SXBRK:
  102.       return ("xbrk  ");
  103.     }
  104.   (void) sprintf (errant, "%06u?", (unsigned char) pstat);
  105.   return (errant);
  106.  
  107. }                /* end of pstat_text */
  108.  
  109. #endif
  110.  
  111. /*+-------------------------------------------------------------------------
  112.     grok_proc() - read and examine kernel process table
  113. --------------------------------------------------------------------------*/
  114. void
  115. grok_proc (server_pointer)
  116.      struct NetworkXswStruct *server_pointer;
  117. {
  118.   register        iproc;
  119.   register struct my_proc_struct *tproc;
  120.   int             temp = 0;
  121.   int             total_trans = 0;
  122.   int             i = 0;
  123.   struct user     tuser;
  124.   int             got_data = 0;
  125.   int             slots_in_use = 0;
  126.  
  127.  
  128. /*
  129.  * Get ticks since boot.....
  130.  */
  131.  
  132.   xsw_write (server_pointer,
  133.          server_pointer -> FileDescriptor,
  134.          send_boot_time,
  135.          sizeof (int));
  136.  
  137.   xsw_read (server_pointer,
  138.         server_pointer -> FileDescriptor,
  139.         &server_pointer -> boot_time,
  140.         sizeof (time_t));
  141.  
  142.  
  143. /*
  144.  * Ask for process data......
  145.  */
  146.  
  147.  
  148.  
  149.   xsw_write (server_pointer,
  150.          server_pointer -> FileDescriptor,
  151.          send_process_data,
  152.          sizeof (int));
  153.  
  154. /*
  155.  * Get number of currently used process slots....
  156.  */
  157.  
  158.  
  159.   xsw_read (server_pointer,
  160.         server_pointer -> FileDescriptor,
  161.         &slots_in_use,
  162.         sizeof (slots_in_use));
  163.  
  164.   xsw_write (server_pointer,
  165.          server_pointer -> FileDescriptor,
  166.          &got_data,
  167.          sizeof (int));
  168.  
  169.  
  170.  
  171. /*
  172.  * Read in the processes.....
  173.  */
  174.  
  175.   xsw_read (server_pointer,
  176.         server_pointer -> FileDescriptor,
  177.         server_pointer -> procs,
  178.         sizeof (struct my_proc_struct) * slots_in_use);
  179.  
  180.   xsw_write (server_pointer,
  181.          server_pointer -> FileDescriptor,
  182.          &got_data,
  183.          sizeof (int));
  184.  
  185.   if (server_pointer -> old_my_user != NULL)
  186.     {
  187.       free (server_pointer -> old_my_user);
  188.     }
  189.  
  190.  
  191.   server_pointer -> old_slots_in_use = server_pointer -> slots_in_use;
  192.   server_pointer -> slots_in_use = slots_in_use;
  193.  
  194.   if (server_pointer -> slots_in_use > server_pointer -> max_slots_in_use)
  195.     {
  196.       server_pointer -> old_max_slots_in_use = server_pointer -> max_slots_in_use;
  197.       server_pointer -> max_slots_in_use = server_pointer -> slots_in_use;
  198.     }
  199.  
  200.   server_pointer -> old_my_user = (struct my_user_struct *)
  201.     malloc (sizeof (struct my_user_struct) * server_pointer -> old_slots_in_use);
  202.  
  203.  
  204.  
  205.   (void) memcpy ((char *) server_pointer -> old_my_user,
  206.          (char *) server_pointer -> my_user,
  207.        sizeof (struct my_user_struct) * server_pointer -> old_slots_in_use);
  208.  
  209.  
  210.   if (server_pointer -> my_user != NULL)
  211.     {
  212.       free (server_pointer -> my_user);
  213.     }
  214.  
  215.  
  216.   server_pointer -> my_user = (struct my_user_struct *)
  217.     malloc (sizeof (struct my_user_struct) * slots_in_use);
  218.  
  219.   xsw_read (server_pointer,
  220.         server_pointer -> FileDescriptor,
  221.         server_pointer -> my_user,
  222.         sizeof (struct my_user_struct) * slots_in_use);
  223.  
  224.  
  225.   for (iproc = 0; iproc < SXBRK + 1; iproc++)
  226.     procs_per_pstat[iproc] = 0;
  227.   procs_in_core = 0;
  228.  
  229.   server_pointer -> old_procs_alive = server_pointer -> procs_alive;
  230.   server_pointer -> procs_alive = 0;
  231.  
  232.   for (iproc = 0; iproc < slots_in_use; iproc++)
  233.     {
  234.       tproc = server_pointer -> pprocs[iproc] = (server_pointer -> procs + iproc);
  235.  
  236.       if (tproc -> p_stat)
  237.     server_pointer -> procs_alive++;
  238.  
  239.  
  240.       procs_per_pstat[tproc -> p_stat]++;    /* count # procs in each
  241.                          * state */
  242.  
  243.       if (tproc -> p_flag & SLOAD)    /* count # procs in memory */
  244.     procs_in_core++;
  245.     }
  246.  
  247.  
  248.  
  249. }                /* end of grok_proc */
  250.  
  251. #ifdef draw_update_Proc
  252. /*+-------------------------------------------------------------------------
  253.     draw_update_Proc(x,y)
  254. --------------------------------------------------------------------------*/
  255. void
  256. draw_update_Proc (x, y)
  257.      int             y;
  258.      int             x;
  259. {
  260.   register        istat;
  261.   register        itmp;
  262.   char           *cptr;
  263.   char            s80[80];
  264.   int             fwidth = FWIDTH;
  265.   int             fheight = FHEIGHT;
  266.   int             len;
  267.   int             x2 = x;
  268.   int             yl1 = y + (FASCENT / 2);
  269.   int             yl2 = y + (fheight / 2) - 1;
  270.   int             ys = y + FASCENT;
  271.  
  272.  
  273.   if (DrawAreaXYWH.height < (y + (fheight * 2)))
  274.     return;
  275.  
  276.   if (redrawing_entire_DrawArea)
  277.     {
  278.       cptr = "---Proc----";
  279.       len = strlen (cptr);
  280.       /* the "background" bar */
  281.       XSetForeground (display, gc, colorSlate.pixel);
  282.       XSetLineAttributes (display, gc, fheight,
  283.               line_style, cap_style, join_style);
  284.       XDrawLine (display, window, gc, x, yl1, x + (len * fwidth), yl1);
  285.  
  286.       /* draw the black line before "Proc" */
  287.       XSetForeground (display, gc, foreground);
  288.       XSetLineAttributes (display, gc, FASCENT / 2,
  289.               line_style, cap_style, join_style);
  290.       XDrawLine (display, window, gc,
  291.          x2, yl1,
  292.          x2 + (len = (fwidth * 3)) - FGAP, yl1);
  293.       x2 += len;
  294.  
  295.       /* draw "Proc" */
  296.       cptr = "Proc";
  297.       XDrawString (display, window, gc, x2, ys, cptr, len = strlen (cptr));
  298.       XDrawString (display, window, gc, x2 + 1, ys, cptr, len);
  299.       x2 += fwidth * len;
  300.  
  301.       /* draw the black line after "Proc" */
  302.       XDrawLine (display, window, gc,
  303.          x2 + FGAP + 1, yl1,
  304.          x2 + (len = (fwidth * 4)), yl1);
  305.     }
  306.   y += fheight;
  307.  
  308.   grok_proc ();
  309.  
  310.   for (istat = SSLEEP; istat <= SXBRK; istat++)
  311.     {
  312.       disp_info_int (window, display, gc, DrawAreaXYWH, x, y, pstat_text (istat), "  %3d", procs_per_pstat[istat]);
  313.       y += fheight;
  314.     }
  315.   disp_info_int (window, display, gc, DrawAreaXYWH, x, y, "total ", "  %3d", procs_alive);
  316.   y += fheight;
  317.   disp_info_int (window, display, gc, DrawAreaXYWH, x, y, "in mem", "  %3d", procs_in_core);
  318.  
  319. }                /* end of draw_update_Proc */
  320.  
  321. #endif
  322. /*+-------------------------------------------------------------------------
  323.     initialize_Proc()
  324. --------------------------------------------------------------------------*/
  325.  
  326. initialize_Proc (server_pointer)
  327.      struct NetworkXswStruct *server_pointer;
  328. {
  329.   static char    *memfail = "cannot alloc memory for proc table";
  330.  
  331. #ifdef DEBUG1
  332.   fprintf (stdout, "In initialize_Proc\n");
  333. #endif
  334. /*
  335.   if (!(server_pointer->real_procs = (struct proc *) malloc (sizeof (struct proc) * server_pointer-> my_v -> v_proc)))
  336.                     leave_text (memfail, 1);
  337. */
  338.  
  339.  
  340.   if (!(server_pointer -> procs = (struct my_proc_struct *) malloc (sizeof (struct my_proc_struct) * server_pointer -> my_v -> v_proc)))
  341.                     leave_text (memfail, 1);
  342.  
  343.  
  344.   if (!(server_pointer -> oldprocs = (struct my_proc_struct *) malloc (sizeof (struct my_proc_struct) * server_pointer -> my_v -> v_proc)))
  345.                     leave_text (memfail, 1);
  346.  
  347.  
  348.   if (!(server_pointer -> pprocs = (struct my_proc_struct **) malloc (sizeof (struct my_proc_struct *) * server_pointer -> my_v -> v_proc)))
  349.                     leave_text (memfail, 1);
  350.  
  351.  
  352.   if (!(server_pointer -> poldprocs = (struct my_proc_struct **) malloc (sizeof (struct my_proc_struct) * server_pointer -> my_v -> v_proc)))
  353.                     leave_text (memfail, 1);
  354.  
  355.  
  356. }                /* end of initialize_Proc */
  357.  
  358. /* vi: set tabstop=4 shiftwidth=4: */
  359. /* end of proc.c */
  360.